/**
 * @file mv_platform_audio.h
 * @author lky (linkunyu@macro-video.com)
 * @brief audio API (ai and ao)
 * @version 0.1
 * @date 2021-05-28
 * 
 * @copyright Copyright (c) 2021
 * 
 */

#ifndef __MVP_AUDIO_H__
#define __MVP_AUDIO_H__

#include "mvvcd.h"

#if __cplusplus
extern "C" {
#endif

/**
 * @brief Audio Attributes: audio type
 */
typedef enum _audio_type_p
{
    MV_AUDIO_TYPE_UNKNOWN_P,
    MV_AUDIO_TYPE_MP3_P,
    MV_AUDIO_TYPE_AAC_P,
    MV_AUDIO_TYPE_PCM_P,
    MV_AUDIO_TYPE_ADPCM_P,
    MV_AUDIO_TYPE_G711A_P,
    MV_AUDIO_TYPE_G711U_P,
    MV_AUDIO_TYPE_ALL_P
}MVP_AUDIO_TYEP_E;

typedef enum _audio_sample_rate_p
{
	MV_AUDIO_SAMPLE_RATE_8000_P = 8000,
	MV_AUDIO_SAMPLE_RATE_16000_P = 16000,
}MVP_AUDIO_SAMPLE_RATE_E;

typedef enum _audio_sample_bit_p
{
	MV_AUDIO_SMPLE_BIT_16_P = 16
}MVP_AUDIO_SAMPLE_BIT_E;

typedef enum _audio_channel_type_p
{
	MV_AUDIO_CHANNEL_RESERVED_P = 0x00,
	MV_AUDIO_CHANNEL_MONO_P,
	MV_AUDIO_CHANNEL_STEREO_P,
}MVP_AUDIO_CHN_TYPE_E;

typedef enum _audio_codec_type_p
{
    MV_AUDIO_HARD_CODEC = 1,
    MV_AUDIO_SOFT_CODEC
}MVP_AUDIO_CODEC_TYPE_E;

typedef enum _mvp_aec_scene {    
    MVP_AUDIO_AEC_INDOOR_SCENE,     ///< default
    MVP_AUDIO_AEC_OUTDOOR_SCENE,
}MVP_AUDIO_AEC_SCENE_E;

typedef struct _audio_data_attr_p
{
    mv_bool_t nr_enable;    
    mv_bool_t agc_eanble;   
    mv_bool_t aec_eanble;   
    MVP_AUDIO_TYEP_E        audio_type;       ///< 音频数据类型
    MVP_AUDIO_CODEC_TYPE_E  audio_codec_type; ///< 音频编码器类型(软/硬编)
    MVP_AUDIO_SAMPLE_RATE_E sample_rate;      ///< 音频采样率
	MVP_AUDIO_SAMPLE_BIT_E  sample_bits;      ///< 音频采样位率
	MVP_AUDIO_CHN_TYPE_E    channel_num;      ///< 音频通道
}MVP_AUDIO_ATTR_T;

/**
 * @brief 音频采集初始化
 * @param e_type [out] 音频帧编码类型[MVP_AUDIO_TYEP_E]
 * @param frame_data [out] 帧数据
 * @param frame_len [out] 数据长度
 * @return mv_s32_t
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
typedef mv_s32_t (*MV_AI_GET_DATA)(MVP_AUDIO_TYEP_E e_type, mv_u8ptr_t frame_data, mv_s32_t frame_len);
typedef mv_s32_t (*MV_AI_GET_RAW_DATA)(mv_u8ptr_t frame_data, mv_s32_t frame_len);

/**
 * @brief 音频采集初始化
 * @param attr [in] < MVP_AUDIO_AI_ATTR_T * >
 * @return mv_s32_t
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ai_init(MVP_AUDIO_ATTR_T *attr);

/**
 * @brief 音频采集反初始化
 * @return mv_s32_t
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ai_uninit(mv_void_t);

/**
 * @brief 开启音频编码
 * @param get_ai_data_cb     [in] 音频裸流数据处理回调
 * @param get_ai_raw_data_cb [in] 音频编码数据处理回调
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_aenc_start(MV_AI_GET_DATA get_ai_data_cb, MV_AI_GET_RAW_DATA get_ai_raw_data_cb);

/**
 * @brief 停止音频编码功能
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_aenc_stop(mv_void_t);

/**
 * @brief 音频采集音量设置
 * @param s32_vol [in] < [1~100] >
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ai_volume_set(mv_s32_t s32_vol);

/**
 * @brief 音频播放通道资源初始化
 * @param attr [in] < MVP_AUDIO_AO_ATTR_T * >
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_init(MVP_AUDIO_ATTR_T *attr);

/**
 * @brief 音频播放通道资源反初始化
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_uninit(mv_void_t);

/**
 * @brief 发送音频编码后的数据去解码并播放
 * @param pu8_data [in] 音频编码数据
 * @param s32_len  [in] 音频编码数据长度
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_sendto_decode(mv_u8ptr_t pu8_data, mv_s32_t s32_len);

/**
 * @brief 发送音频裸流数据去播放
 * @param pu8_pcmdata [in] 音频裸流数据
 * @param s32_len     [in] 音频裸流数据长度
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_sendto_render(mv_u8ptr_t pu8_pcmdata, mv_s32_t len);

/**
 * @brief 播放音频文件
 * @param pv8_filename [in] 文件路径
 * @param s32_loop_cnt [in] 播放次数
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_play_file(mv_v8ptr_t pv8_filename, mv_s32_t s32_loop_cnt);

/**
 * @brief 打断音频文件播放
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_play_file_break();

/**
 * @brief 设置音频播放音量大小
 * @param s32_vol [in] < [1-100] >
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_volume_set(mv_s32_t s32_vol);

/**
 * @brief 获取音频播放音量大小
 * @param ps32_vol [out] < [1-100] >
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_volume_get(mv_s32ptr_t ps32_vol);

/**
 * @brief 暂停音频播放
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_resume();

/**
 * @brief 恢复音频播放
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_pause();

/**
 * @brief 检查音频播放通道是否还有数据
 * @return mv_bool_t 
 */
mv_bool_t mvp_ao_chn_data_check();

/**
 * @brief 控制回音消除开关，开启时使用回音消除调试时测试的音量数值，关闭时使用句柄的音量参数
 * @param u8_switch [in] 回音消除选择 1:回音消除  0:默认参数
 * @param u8_aec_scene_type [in] 回音消除特殊场景
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ai_aec_ctrl(mv_u8_t u8_switch, mv_u8_t u8_aec_scene_type);
/**
 * @brief 控制回音消除开关，开启时使用回音消除调试时测试的音量数值，关闭时使用句柄的音量参数
 * @param u8_switch [in] 回音消除选择 1:回音消除  0:默认参数
 * @param u8_aec_scene_type [in] 回音消除特殊场景
 * @return mv_s32_t 
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvp_ao_aec_ctrl(mv_u8_t u8_switch, mv_u8_t u8_aec_scene_type);

#if __cplusplus
}
#endif

#endif